﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data; // Bruges for at kunne bestemme CommandType
using System.Data.SqlClient; // Bruger SQL clienten.
using System.Data.SqlTypes; // Bruges til at bruge scripted typer, idet det skal bruges parametere.


namespace Controller
{
    public class DBFacade
    {

       
        /********** ATTRIBUTES **********/
        private SqlConnection dbCon;
        private SqlCommand dbCommand;
        private SqlDataReader dataReader = null;
        string connectionstring;

        /********** CONSTRUCTOR **********/


        public DBFacade()

        {
            // Denne følgende linie, fortæller adressen på databasen, hvilken catalog der skal bruges og hvilken login der skal bruges.
            connectionstring = @"Data Source=linux1.tietgen.dk;Initial Catalog=gruppe4;User ID=gruppe4;Password=DUr847afrE";


            // Connection objekt.
            dbCon = new SqlConnection(connectionstring); // Definere vores SQL connection.

            // Command Objekt
            dbCommand = new SqlCommand();
            dbCommand.CommandType = CommandType.StoredProcedure;
            dbCommand.Connection = dbCon;
        }


        #region Adresse

       
        public int CreateAdresse(int postNr, string vejNavn, string vejNr, string sal, string telefonNr, string email)
        {
            int adresseId;
            SqlParameter par;
            dbCommand.CommandText = "SP_CreateAdresse";
            dbCommand.CommandType = CommandType.StoredProcedure; //  For at kunne køre stored procedures.      
            dbCommand.Parameters.Clear();

            // Parameter 1.
            par = new SqlParameter("@adresseId", SqlDbType.Int);
            par.Direction = ParameterDirection.Output; // fortæller der kommer en retur type.
            dbCommand.Parameters.Add(par);

            // Parameter 2
            par = new SqlParameter("@postNr", SqlDbType.NVarChar);
            par.Value = postNr;
            dbCommand.Parameters.Add(par);

            // Parameter 3
            par = new SqlParameter("@vejNavn", SqlDbType.NVarChar);
            par.Value = vejNavn;
            dbCommand.Parameters.Add(par);

            // Parameter 4
            par = new SqlParameter("@vejNr", SqlDbType.NVarChar);
            par.Value = vejNr;
            dbCommand.Parameters.Add(par);

            // Parameter 5
            par = new SqlParameter("@sal", SqlDbType.NVarChar);
            par.Value = sal;
            dbCommand.Parameters.Add(par);

            // Parameter 5
            par = new SqlParameter("@telefonNr", SqlDbType.NVarChar);
            par.Value = telefonNr;
            dbCommand.Parameters.Add(par);

            // Parameter 6
            par = new SqlParameter("@email", SqlDbType.NVarChar);
            par.Value = email;
            dbCommand.Parameters.Add(par);

            try
            {
                dbCon.Open();
                dbCommand.ExecuteNonQuery();
                adresseId = (int)dbCommand.Parameters["@adresseId"].Value;
            }
            catch (Exception e)
            {
                throw new SystemException(e.ToString());
            }
            finally
            {
                if (dbCon != null)
                {
                    dbCon.Close();
                }
            }
            return adresseId;
        }

       
        public void UpdateAdresse(int kontaktId, int postNr, string vejNavn, string vejNr, string sal, string telefonNr, string email)
        {
            dbCommand.CommandText = "SP_UpdateAdresse";
            dbCommand.Parameters.Clear();
            SqlParameter par;

            par = new SqlParameter("@adresseId", SqlDbType.Int);
            par.Value = kontaktId;
            dbCommand.Parameters.Add(par);
            par = new SqlParameter("@postNr", SqlDbType.Int);
            par.Value = postNr;
            dbCommand.Parameters.Add(par);
            par = new SqlParameter("@vejNavn", SqlDbType.NVarChar);
            par.Value = vejNavn;
            dbCommand.Parameters.Add(par);
            par = new SqlParameter("@vejNr", SqlDbType.NVarChar);
            par.Value = vejNr;
            dbCommand.Parameters.Add(par);
            par = new SqlParameter("@sal", SqlDbType.NVarChar);
            par.Value = sal;
            dbCommand.Parameters.Add(par);
            par = new SqlParameter("@telefonNr", SqlDbType.NVarChar);
            par.Value = telefonNr;
            dbCommand.Parameters.Add(par);
            par = new SqlParameter("@email", SqlDbType.NVarChar);
            par.Value = email;
            dbCommand.Parameters.Add(par);
            try
            {
                dbCon.Open();
                dbCommand.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new SystemException(e.ToString());
            }
            finally
            {
                if (dbCon != null)
                {
                    dbCon.Close();
                }
            }
            return;
        }
        

        public LinkedList<string[]> GetPostByNavn()
        {
            LinkedList<string[]> postByRegion = new LinkedList<string[]>();
            string[] pBR = new string[3];
            dbCon.Open();
            dbCommand.CommandText = "SP_GetPostByNavn";
            dbCommand.Parameters.Clear();
            try
            {
                dataReader = dbCommand.ExecuteReader();
                while (dataReader.Read() == true)
                {
                    pBR = new string[3];
                    pBR[0] = dataReader[0].ToString();
                    pBR[1] = dataReader[1].ToString();
                    pBR[2] = dataReader[2].ToString();
                    postByRegion.AddLast(pBR);
                }
            }
            catch (Exception e)
            {
                throw new SystemException(e.ToString());
            }
            finally
            {
                if (dbCon != null)
                {
                    dbCon.Close();
                }
            }
            return postByRegion;
        }

        #endregion


        #region Hold

        public string OpretHold(int holdId, int ridningstypeId, DateTime ugedag, DateTime starttid, DateTime sluttid, int maksantal, int holdpriserId)
        {
            string sqlfejl = null;

            dbCommand.CommandText = "OpretHold";
            dbCommand.Parameters.Clear();

            SqlParameter par;

            par = new SqlParameter("@holdId", SqlDbType.Int);
            par.Value = holdId;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@ridningstypeId", SqlDbType.Int);
            par.Value = ridningstypeId;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@ugedag", SqlDbType.DateTime);
            par.Value = ugedag;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@starttid", SqlDbType.DateTime);
            par.Value = starttid;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@sluttid", SqlDbType.DateTime);
            par.Value = sluttid;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@maksAntal", SqlDbType.Int);
            par.Value = maksantal;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@holdpriserId", SqlDbType.Int);
            par.Value = holdpriserId;
            dbCommand.Parameters.Add(par);


            try
            {
                dbCon.Open();             // Åben forbindelsen til databasen
                dbCommand.ExecuteNonQuery(); ;   // Udfør kommando
                dbCon.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                sqlfejl = ex.Number.ToString();
                if (dbCon.State == ConnectionState.Open)          // Luk forbindelsen
                    dbCon.Close();
            }
            return sqlfejl;
        }
        
        public string TilknytPerson(int personholdId, int holdId, int personId)
        {
            string sqlfejl = null;

            dbCommand.CommandText = "OpretHold";
            dbCommand.Parameters.Clear();

            SqlParameter par;

            par = new SqlParameter("@personholdId", SqlDbType.Int);
            par.Value = personholdId;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@holdId", SqlDbType.Int);
            par.Value = holdId;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@personId", SqlDbType.Int);
            par.Value = personId;
            dbCommand.Parameters.Add(par);

            try
            {
                dbCon.Open();             // Åben forbindelsen til databasen
                dbCommand.ExecuteNonQuery();   // Udfør kommando
                dbCon.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                sqlfejl = ex.Number.ToString();
                if (dbCon.State == ConnectionState.Open)          // Luk forbindelsen
                    dbCon.Close();
            }
            return sqlfejl;
        }

        public string OpretHoldpris(int holdpriserId, string prisnavn, int sats)
        {
            string sqlfejl = null;

            dbCommand.CommandText = "OpretHoldpris";
            dbCommand.Parameters.Clear();

            SqlParameter par;

            par = new SqlParameter("@holdpriserId", SqlDbType.Int);
            par.Value = holdpriserId;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@prisnavn", SqlDbType.NVarChar);
            par.Value = prisnavn;
            dbCommand.Parameters.Add(par);

            par = new SqlParameter("@sats", SqlDbType.Int);
            par.Value = sats;
            dbCommand.Parameters.Add(par);

            try
            {
                dbCon.Open();             // Åben forbindelsen til databasen
                dbCommand.ExecuteNonQuery();   // Udfør kommando
                dbCon.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                sqlfejl = ex.Number.ToString();
                if (dbCon.State == ConnectionState.Open)          // Luk forbindelsen
                    dbCon.Close();
            }
            return sqlfejl;
        }

        public string SletHold(int holdId)
        {
            string sqlfejl = null;

            dbCommand.CommandText = "SletHold";
            dbCommand.Parameters.Clear();

            SqlParameter par;

            par = new SqlParameter("@holdId", SqlDbType.Int);
            dbCommand.Parameters.Add(par);

            try
            {
                dbCon.Open();             // Åben forbindelsen til databasen
                dbCommand.ExecuteNonQuery();   // Udfør kommando
                dbCon.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                sqlfejl = ex.Number.ToString();
                if (dbCon.State == ConnectionState.Open)          // Luk forbindelsen
                    dbCon.Close();
            }
            return sqlfejl;
        }

        public string RedigerHold(int holdId, DateTime ugedag, DateTime starttid, DateTime sluttid, int maksAntal, int holdpriserId)
        {
            string sqlfejl = null;

            dbCommand.CommandText = "RedigerHold";
            dbCommand.Parameters.Clear();

            dbCommand.Parameters.Add("@holdId", SqlDbType.Int);
            dbCommand.Parameters.Add("@ugedag", SqlDbType.DateTime);
            dbCommand.Parameters.Add("@starttid", SqlDbType.DateTime);
            dbCommand.Parameters.Add("@sluttid", SqlDbType.DateTime);
            dbCommand.Parameters.Add("@maksAntal", SqlDbType.Int);
            dbCommand.Parameters.Add("@holdpriserId", SqlDbType.Int);

            try
            {
                dbCon.Open();             // Åben forbindelsen til databasen
                dbCommand.ExecuteNonQuery();   // Udfør kommando
                dbCon.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                sqlfejl = ex.Number.ToString();
                if (dbCon.State == ConnectionState.Open)          // Luk forbindelsen
                    dbCon.Close();
            }
            return sqlfejl;
        }

        public string RedigerPerson_Hold(int personholdId, int holdId, int personId)
        {
            string sqlfejl = null;

            dbCommand.CommandText = "RedigerPerson_hold";
            dbCommand.Parameters.Clear();

            dbCommand.Parameters.Add("@personholdId", SqlDbType.Int);
            dbCommand.Parameters.Add("@holdId", SqlDbType.Int);
            dbCommand.Parameters.Add("@personId", SqlDbType.Int);

            try
            {
                dbCon.Open();             // Åben forbindelsen til databasen
                dbCommand.ExecuteNonQuery();   // Udfør kommando
                dbCon.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                sqlfejl = ex.Number.ToString();
                if (dbCon.State == ConnectionState.Open)          // Luk forbindelsen
                    dbCon.Close();
            }
            return sqlfejl;
        }
        #endregion
    }
}
